#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
int f[101][maxn],n,m,k,num[11];
struct node
{
	int ki,w,v;
	bool friend operator <(node a,node b)
	{
		return a.ki<b.ki;
	}
}a[101];
int main()
{
	while(scanf("%d%d%d",&n,&m,&k)!=EOF)
	{
		memset(num,0,sizeof(num));
		for(int i=1;i<=n;i++)
			scanf("%d%d%d",&a[i].ki,&a[i].w,&a[i].v);
		sort(a+1,a+n+1);
		for(int i=1;i<=n;i++)
			num[a[i].ki]++;
		for(int i=1;i<=k;i++)
			num[i]+=num[i-1];
		for(int i=1;i<=k;i++)
			for(int j=0;j<=m;j++)f[i][j]=-1;
		for(int j=1;j<=m;j++)f[0][j]=0;
		for(int i=1;i<=k;i++)
			for(int t=num[i-1]+1;t<=num[i];t++)
				for(int j=m;j>=1;j--)
					if(j-a[t].w>=0)
					{
						if(f[i][j-a[t].w]!=-1&&f[i][j]<f[i][j-a[t].w]+a[t].v)
							f[i][j]=f[i][j-a[t].w]+a[t].v;
						if(f[i-1][j-a[t].w]!=-1&&f[i][j]<f[i-1][j-a[t].w]+a[t].v)
							f[i][j]=f[i-1][j-a[t].w]+a[t].v;
					}
		if(f[k][m]<0)printf("Impossible\n");
		else printf("%d\n",f[k][m]);
	}
	return 0;
}

			

